// 引入登录接口
import { login, getUserInfo, getUserDetailById } from '@/api/user'
// 引入存入本地的所有方法
import { setToken, getToken, removeToken } from '@/utils/auth'

export default {
  // 开启命名空间
  namespaced: true,
  // 放置响应式数据
  state: {
    token: getToken() || '', // 这个初始值和后端返回的格式保持统一
    userInfo: {} // 用户数据
  },
  // 放置修改响应式数据的方法
  mutations: {
    setToken(state, token) {
      state.token = token
      // 存入本地
      setToken(token)
    },
    removeToken(state) {
      state.token = ''
      // 别忘了本地清理
      removeToken()
    },
    // 操作用户数据
    setUserInfo(state, userInfo) {
      // console.log('mutation函数被调用了参数为:', userInfo)
      state.userInfo = userInfo
    },
    removeUserInfo(state) {
      state.userInfo = {}
    }
  },
  // 异步操作 + 提交mutation函数
  actions: {
    // 发送登录的异步请求获取token
    // 通过调用mutation函数存起来
    asyncSetToken(ctx, payload) {
      return new Promise((resolve, reject) => {
        // payload 将来调用action函数时传下来的接口参数data
        login(payload).then(res => {
          // 调用mutation函数
          ctx.commit('setToken', res.data)
          // 数据返回之后resolve
          resolve(res)
        }).catch(() => {
          reject('接口错误')
        })
      })
    },
    // 获取用户数据
    asyncSetUserInfo(ctx, payload) {
      return new Promise((resolve, reject) => {
        // 1.发送异步请求
        getUserInfo().then(res => {
          // 2.调用mutation函数修改数据   ctx.commit('setUserInfo')
          // 有了用户id之后发送获取头像的接口
          getUserDetailById(res.data.userId).then(newRes => {
            // 将新数据和老数据做一个组合 一起添加到userInfo
            ctx.commit('setUserInfo', { ...res.data, ...newRes.data })
            resolve(res)
          })
        })
      })
      // 这个接口的之前往前依赖于登录之后拿到token   往后保证我的用户信息拿到之后才能跳转首页
    },
    // 登出
    asyncLoginout(ctx) {
      // 如果业务需要调用登录接口的话先调用接口
      // 清空本地存储的用户信息 (调用一个mutation函数)
      ctx.commit('removeToken')
      ctx.commit('removeUserInfo')
    }
  }
}
